//
//  MessageCompile.m
//  Server
//
//  Created by jyh on 2018/7/25.
//  Copyright © 2018年 huig. All rights reserved.
//

#import "MessageCompile.h"
#import "Immessage.pbobjc.h"
#import "MessageModel.h"

@implementation MessageCompile

/**
 包装一个信息报

 @param object 要包装的对象
 @param messageType 这个包的信息类型
 @param packageType 要包装的格式
 @return 返回包
 */
+ (NSData *)packageMessage:(id)object messageType:(messageType)messageType packageType:(packageType)packageType {
    
    /* messageType = 0,系统信息;1,TextMessage;2,GiftMessage */
    if (packageType > 2 || packageType < 0) return nil;
    
    NSData *data = [NSData data];
    // 包装string类型
    if (packageType == 0) {
        data = [object dataUsingEncoding:NSUTF8StringEncoding];
    }
    // 包装对象类型
    if (packageType > 0 && packageType <= 2) {
        data = [object data];
    }
    // 包装头部
    NSInteger length = data.length;
    NSData *headerData = [NSData dataWithBytes:&length length:4];
    // 包装类型
    NSData *typeData = [NSData dataWithBytes:&messageType length:2];
    // 将头部,类型,和信息.合成一个包
    NSMutableData *dataM = [NSMutableData data];
    [dataM appendData:headerData];
    [dataM appendData:typeData];
    [dataM appendData:data];
    
    return dataM;
}


+ (MessageModel *)parsingWithData:(NSData *)data {
    
    NSInteger totalSize = data.length - 6;
    // 取出头部数据
    NSData *headData = [data subdataWithRange:NSMakeRange(0, 4)];
    unsigned int msgSize = 0;
    [headData getBytes:&msgSize length:4];
    // 如果信息数据长度不一致证明包邮问题.
    if (totalSize != msgSize) return nil;
    // 取出类型数据
    NSData *typeData = [data subdataWithRange:NSMakeRange(4, 2)];
    messageType msgType = 0;
    [typeData getBytes:&msgType length:2];
    // 取出信息数据
    NSData *msgData = [data subdataWithRange:NSMakeRange(6, totalSize)];
    
    /*
     type
     0,心跳包 messageTypeHeart,
     1,系统信息 messageTypeSystem,
     2,进入房间 messageTypeJoinRoom,
     3,离开房间 messageTypeLeaveRoom,
     4,文本信息 messageTypecChat,
     5,礼物信息 messageTypeGift,
     6,指定接受用户 messageTypeReceiver,
     */
    
    MessageModel *model = [MessageModel new];
    model.type = msgType;
    
    if (msgType > 6 || msgType < 0) return nil;

    // 处理文本信息
    if (msgType >= 0 && msgType <= 1) {
        NSString *str = [[NSString alloc] initWithData:msgData encoding:NSUTF8StringEncoding];
        model.msgData = str;
        return model;
    }
    // 处理对象信息
    if (msgType > 1 && msgType <= 6) {
        model.msgData = [[self getClass:msgType] parseFromData:msgData error:nil];
        return model;
    }
    return nil;
}


/**
 根据类型获取对应的类

 @param type 类型
 @return class
 */
+ (id)getClass:(messageType)type {
    NSDictionary *messageTypeDic = [self getClassNameDic];
    NSString *typeName = messageTypeDic[@(type)];
    return NSClassFromString(typeName);
}

/**
 类型映射表
 
 @return dict
 */
+ (NSDictionary *)getClassNameDic {
    return @{@(messageTypeHeart)    :   @"NSString",
             @(messageTypeSystem)   :   @"NSString",
             @(messageTypeJoinRoom) :   @"TextMessage",
             @(messageTypeLeaveRoom):   @"TextMessage",
             @(messageTypeChat)     :   @"TextMessage",
             @(messageTypeReceiver) :   @"TextMessage",
             @(messageTypeGift)     :   @"GiftMessage"
             };
}

@end
